import { screen, mouse, keyboard, Key, Image, Region } from '@nut-tree/nut-js';
import '@nut-tree/template-matcher';
import { imageToBase64 } from './imageUtil.js';
import { find as findScreenRegion } from './screenUtil.js';

// 企业微信消息读取器类
export class WechatWorkMessageReader {
  constructor() {
    // 配置参数
    this.config = {
      wechatWorkIconTemplate: './src/assets/wechat-work-icon.png', // 企业微信图标模板
      newMessageIconTemplate: './src/assets/new-message-icon.png', // 新消息图标模板
      messageItemRegion: { width: 300, height: 60 }, // 消息项区域大小
      messageContentRegion: { x: 300, y: 0, width: 800, height: 600 }, // 消息内容区域位置
      confidenceThreshold: 0.8, // 模板匹配置信度阈值
      retryAttempts: 3, // 重试次数
      retryDelayMs: 1000 // 重试延迟（毫秒）
    };
  }

  // 初始化企业微信消息读取器
  async init() {
    try {
      console.log('企业微信消息读取器初始化中...');
      // 设置屏幕配置
      screen.config.autoHighlight = true;
      screen.config.highlightDurationMs = 2000;
      console.log('初始化完成');
      return true;
    } catch (error) {
      console.error('初始化失败:', error);
      return false;
    }
  }

  // 定位并激活企业微信窗口
  async locateAndActivateWechatWork() {
    try {
      console.log('正在寻找企业微信窗口...');
      // 尝试定位企业微信图标或窗口
      // 注意：实际使用时需要准备企业微信的图标模板
      const wechatWorkIconBase64 = await imageToBase64(this.config.wechatWorkIconTemplate);
      const wechatWorkRegion = await findScreenRegion(wechatWorkIconBase64, this.config.confidenceThreshold);
      
      if (wechatWorkRegion) {
        console.log('找到企业微信窗口:', wechatWorkRegion);
        // 点击企业微信图标以激活窗口
        await mouse.move({
          x: wechatWorkRegion.x + wechatWorkRegion.width / 2,
          y: wechatWorkRegion.y + wechatWorkRegion.height / 2
        });
        await mouse.leftClick();
        return true;
      }
      return false;
    } catch (error) {
      console.error('定位企业微信窗口失败:', error);
      return false;
    }
  }

  // 检查并读取新消息
  async checkAndReadNewMessages() {
    try {
      console.log('正在检查新消息...');
      const newMessages = [];
      
      // 尝试定位新消息图标
      // 注意：实际使用时需要准备新消息图标的模板
      const newMessageIconBase64 = await imageToBase64(this.config.newMessageIconTemplate);
      
      // 在消息列表区域查找新消息
      // 这里使用简化的实现，实际项目中可能需要根据企业微信界面调整
      let attempts = 0;
      while (attempts < this.config.retryAttempts) {
        try {
          // 查找新消息图标
          const messageRegion = await findScreenRegion(newMessageIconBase64, this.config.confidenceThreshold - 0.1);
          
          if (messageRegion) {
            console.log('找到新消息:', messageRegion);
            
            // 点击新消息
            await mouse.move({
              x: messageRegion.x + this.config.messageItemRegion.width / 2,
              y: messageRegion.y + this.config.messageItemRegion.height / 2
            });
            await mouse.leftClick();
            
            // 等待消息内容加载
            await new Promise(resolve => setTimeout(resolve, 1000));
            
            // 截取消息内容区域
            // 注意：nut-js v4.x 开始，screen.capture 方法已更改，需要使用新的API
            const messageContentScreenshot = await screen.grabRegion(new Region(
              this.config.messageContentRegion.x,
              this.config.messageContentRegion.y,
              this.config.messageContentRegion.width,
              this.config.messageContentRegion.height
            ));
            
            // 这里只是示例，实际项目中可能需要使用OCR技术提取文本内容
            const messageData = {
              timestamp: new Date().toISOString(),
              position: messageRegion,
              screenshot: messageContentScreenshot
            };
            
            newMessages.push(messageData);
            console.log('已记录新消息');
          }
          
          attempts++;
          if (attempts < this.config.retryAttempts) {
            await new Promise(resolve => setTimeout(resolve, this.config.retryDelayMs));
          }
        } catch (innerError) {
          console.error(`检查新消息时出错 (尝试 ${attempts + 1}/${this.config.retryAttempts}):`, innerError);
          attempts++;
          if (attempts < this.config.retryAttempts) {
            await new Promise(resolve => setTimeout(resolve, this.config.retryDelayMs));
          }
        }
      }
      
      return newMessages;
    } catch (error) {
      console.error('检查并读取新消息失败:', error);
      return [];
    }
  }

  // 主循环，持续监控新消息
  async startMonitoring(intervalMs = 5000) {
    try {
      // 确保企业微信已打开
      const isWechatWorkActive = await this.locateAndActivateWechatWork();
      if (!isWechatWorkActive) {
        console.warn('未找到企业微信窗口，请手动打开企业微信');
      }
      
      console.log(`开始监控企业微信消息，检查间隔: ${intervalMs}ms`);
      
      // 开始监控循环
      while (true) {
        const newMessages = await this.checkAndReadNewMessages();
        
        if (newMessages.length > 0) {
          console.log(`发现 ${newMessages.length} 条新消息`);
          // 这里可以添加处理新消息的逻辑
          // 例如：保存到文件、发送到服务器、触发其他操作等
        }
        
        await new Promise(resolve => setTimeout(resolve, intervalMs));
      }
    } catch (error) {
      console.error('监控企业微信消息时发生错误:', error);
    }
  }

  // 停止监控
  async stopMonitoring() {
    console.log('停止监控企业微信消息');
    // 实际项目中可能需要清理资源
  }
}

// 创建默认实例
export const wechatWorkMessageReader = new WechatWorkMessageReader();

export default wechatWorkMessageReader;